package com.itheima._07静态泛型方法和通配符上下限;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description Demo072
 * @Author songyu
 * @Date 2025-07-19  15:03
 */
class Che{}
class Car extends Che{}
class Bmw extends Car{}
class Cat{}
public class Demo072 {

    public static void main(String[] args) {
        //目标：泛型通配符，上限和下限
        // List<?> ：？可以代表任意类型，和List<Object>一样
        // List<Car>:  写死类型，只能是Car, 父类或子类都不可以, 使用最多
        // List<? extends Car> ：泛型的上限，？可以代表Car和Car的子类
        // List<? super Car> ：泛型的下限，？可以代表Car和Car的父类
        // 注意 不带泛型的List都可以被上面接收，但是不建议不使用泛型集合

        //创建所有对象
        Che che = new Che();
        List<Che> cheList = new ArrayList<>();
        cheList.add(che);

        Car car = new Car();
        List<Car> carList = List.of(car);
        //使用这个方法简化创建集合并添加元素
        //这种方法创建的集合里面的元素地址是不可以更改，因为里面的元素都用final修饰了
        // carList.set(0,new Car());运行会报错，因为final修饰无法改变内存地址

        Bmw bmw = new Bmw();
        List<Bmw> bmwList = List.of(bmw);

        Cat cat = new Cat();
        List<Cat> catList = List.of(cat);

        //利用上面的集合调用下面的方法，观察是否匹配
        printCar1(cheList);
        printCar1(bmwList);
        printCar1(carList);
        printCar1(catList);//证明了List<?>可以匹配任何类型

        // printCar2(cheList);
        // printCar2(bmwList);
        printCar2(carList);
        // printCar2(catList); //证明了List<Car>值匹配泛型为Car类型

        // printCar3(cheList);
        printCar3(bmwList);
        printCar3(carList);
        // printCar3(catList);//证明了List<? extends Car>值匹配通配符上限，Car及其子类

        printCar4(cheList);
        // printCar4(bmwList);
        printCar4(carList);
        // printCar4(catList);//证明了List<? super Car>值匹配通配符下限，Car及其父类
    }

    public static void printCar1(List<?> list){
        System.out.println(list);
    }
    public static void printCar2(List<Car> list){
        System.out.println(list);
    }
    public static void printCar3(List<? extends Car> list){
        System.out.println(list);
    }
    public static void printCar4(List<? super Car> list){
        System.out.println(list);
    }
}